﻿//-----------------------------------------------------------------------
// <copyright file="FrontalMethod.cs" company="InfTech Ltd">
//     Copyright (c) InfTech Ltd. All rights reserved.
// </copyright>
//-----------------------------------------------------------------------

namespace FrontalMethod
{
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Globalization;
    using System.IO;
    using System.Text;

    public sealed class FrontalMethod
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="FrontalMethod"/> class.
        /// </summary>
        public FrontalMethod()
        {
        }

        /// <summary>
        /// Запись выходного файла.
        /// </summary>
        public static void CreateOutFile(StreamWriter streamWriter, int multiplier, List<int> AllPointsNum, List<Point[]>[] InsidePoints, int cZoneCount, List<Point>[] AllPoints, List<Point[]> AllElem, List<Point> AllPointsArray)
        {
            // Формируем список всех узлов и их номеров
            int NodeNum = 0;
            for (int j = 0; j < cZoneCount; j++)
            {
                for (int i = 0; i < AllPoints[j].Count; i++)
                {
                    if (FindIndexInList(AllPointsArray, AllPoints[j][i]) == -1)
                    {
                        NodeNum++;
                        AllPointsArray.Add(AllPoints[j][i]);
                        AllPointsNum.Add(NodeNum);
                    }
                }
            }

            int iNodeCount = AllPointsArray.Count; // Количество узлов
            int iElemCount = 0; // Количество КЭ
            for (int j = 0; j < cZoneCount; j++)
            {
                iElemCount += InsidePoints[j].Count;
            }

            // Формируем список всех КЭ
            for (int j = 0; j < cZoneCount; j++)
            {
                for (int i = 0; i < InsidePoints[j].Count; i++)
                {
                    AllElem.Add(InsidePoints[j][i]);
                }
            }

            ////var sw = File.CreateText("nodes.ftm");
            streamWriter.WriteLine(string.Empty);
            streamWriter.WriteLine(iNodeCount + "  Количество узлов");
            streamWriter.WriteLine(iElemCount + "  Количество элементов");
            streamWriter.WriteLine(string.Empty);
            streamWriter.WriteLine("Координаты узлов");

#warning have to use this number format to write in outfile
#warning AllPointsArray
#warning AllPointsNum
#warning AllElem
            var numInfo = new NumberFormatInfo();
            numInfo.NumberDecimalSeparator = ".";

            // Выводим координаты всех узлов
            for (int j = 0; j < AllPointsArray.Count; j++)
            {
                string pointNumber = AllPointsNum[j].ToString();
                string pointCoordinateX = Math.Round(1.0 * AllPointsArray[j].X / multiplier, 2).ToString();
                string pointCoordinateY = Math.Round(1.0 * AllPointsArray[j].Y / multiplier, 2).ToString();
                streamWriter.WriteLine(pointNumber + '\t' + pointCoordinateX + '\t' + pointCoordinateY);
            }

            streamWriter.WriteLine(string.Empty);
            streamWriter.WriteLine("Номера узлов, составляющие КЭ");
            for (int j = 0; j < iElemCount; j++)
            {
                streamWriter.WriteLine(
                    (j + 1).ToString() + '\t' + (FindIndexInList(AllPointsArray, AllElem[j][0]) + 1) +
                    '\t' + (FindIndexInList(AllPointsArray, AllElem[j][1]) + 1) + '\t' +
                    (FindIndexInList(AllPointsArray, AllElem[j][2]) + 1));
            }
        }

        /// <summary>
        /// Нахождение позиции точки в списке.
        /// </summary>
        /// <param name="list">
        /// список точке.
        /// </param>
        /// <param name="p">
        /// искомая точка.
        /// </param>
        /// <returns>
        /// номер точки в списке.
        /// </returns>
        public static int FindIndexInList(List<Point> list, Point p)
        {
            int index = list.FindIndex(el => el == p);
            return index;
        }

    }
}
